#include "UP_test.h"
#include "gd32f4xx.h"
#include "systick.h"
#include "UP_USART.h"
#include "UP_GPIO.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LED1 PE3
#define LED2 PD7
#define LED3 PG3
#define LED4 PA5

// 初始化UP_GPIO类型的数组leds_list，存放LED1~LED4的引脚信息
UP_GPIO leds_list[] = {
    LED1,
    LED2,
    LED3,
    LED4,
};


void USART_test(void)
{
    systick_config();
    USART_init(
        USART0,         // USART USARTx(x=0,1,2,5) / UARTx(x=3,4,6,7)
        115200U,        // 波特率
        USART_WL_8BIT,  // 数据位
        USART_STB_1BIT, // 停止位
        USART_PM_NONE   // 校验位
    );

    while (1)
    {
        printf("counter=%d num=%f \r\n", 12, 123.4);
        delay_1ms(500);
    }
}

void USART_test_receive(void)
{
    systick_config();

    GPIO_Init(LED1, 0);
    GPIO_Init(LED2, 0);
    GPIO_Init(LED3, 0);
    GPIO_Init(LED4, 0);

    UP_USART config;
    config.TR_mode = USART_RECEIVE_TRANSMIT_MODE; // 串口发送接收模式  00禁用(0), 01接收(1), 10发送(2), 11发送接收(3)
    config.nvic_irq_pre_priority = 2;
    config.nvic_irq_sub_priority = 2;

    USART_init_with_config(
        USART0,         // USART USARTx(x=0,1,2,5) / UARTx(x=3,4,6,7)
        115200U,        // 波特率
        USART_WL_8BIT,  // 数据位
        USART_STB_1BIT, // 停止位
        USART_PM_NONE,  // 校验位
        config
    );

    printf("----------------------------usart test \r\n");

    while (1)
    {
    }
}

void on_usart_data_received(uint32_t USARTx, uint8_t *data, uint16_t size)
{
    printf("size:%d ", size); // 打印接收的数据长度
    printf("usart_data:%s\r\n", data);  // 打印接收的数据

    if (strncmp((char *)data, "led", 3) == 0)
    {
        // 根据接收到的ledx on/off信号控制指定灯亮灭

        char *cmd = strtok((char *)data, " ");
        char *arg = strtok(NULL, " ");
        int led_num = atoi(&cmd[3]);

        printf("cmd: %s\n", cmd);
        printf("arg: %s\n", arg);
        printf("led_num: %d\n", led_num);

        if (led_num > 0 && led_num <= 4)
        {
            if (strcmp(arg, "on") == 0)
            {
                GPIO_Set(leds_list[led_num - 1], 1);
            }
            else if (strcmp(arg, "off") == 0)
            {
                GPIO_Set(leds_list[led_num - 1], 0);
            }
        }
    }
}